"""日志配置模块.

本模块提供统一的日志记录功能,支持:
1. 控制台输出
2. 文件记录
3. 日志分级
4. 日志轮转
"""

import logging
import os
import sys
from datetime import datetime
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional

from .config import Config

class Logger:
    """日志管理类,提供统一的日志记录功能."""
    
    _instance: Optional[logging.Logger] = None
    
    @classmethod
    def get_logger(cls, name: str = "crcs") -> logging.Logger:
        """获取或创建日志记录器实例.
        
        Args:
            name: 日志记录器名称
            
        Returns:
            logging.Logger: 配置好的日志记录器实例
        """
        if cls._instance is None:
            cls._instance = cls._setup_logger(name)
        return cls._instance
    
    @staticmethod
    def _setup_logger(name: str) -> logging.Logger:
        """设置和配置日志记录器.
        
        配置内容包括:
        1. 日志级别(开发环境:DEBUG, 生产环境:INFO)
        2. 日志格式(详细格式用于文件,简单格式用于控制台)
        3. 日志处理器(控制台+文件)
        
        Args:
            name: 日志记录器名称
            
        Returns:
            logging.Logger: 配置好的日志记录器实例
        """
        logger = logging.getLogger(name)
        logger.setLevel(logging.DEBUG if Config.is_development() else logging.INFO)
        
        # 创建格式化器
        # 详细格式: 时间 - 名称 - 级别 - 文件:行号 - 消息
        detailed_formatter = logging.Formatter(
            "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s"
        )
        # 简单格式: 时间 - 级别 - 消息
        simple_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
        
        # 控制台处理器
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setFormatter(simple_formatter)
        console_handler.setLevel(logging.DEBUG if Config.is_development() else logging.INFO)
        
        # 文件处理器
        log_dir = Path("logs")
        log_dir.mkdir(exist_ok=True)
        
        current_date = datetime.now().strftime("%Y-%m-%d")
        file_handler = RotatingFileHandler(
            filename=log_dir / f"{name}_{current_date}.log",
            maxBytes=10 * 1024 * 1024,  # 10MB
            backupCount=5,  # 保留5个备份文件
            encoding="utf-8"
        )
        file_handler.setFormatter(detailed_formatter)
        file_handler.setLevel(logging.INFO)
        
        # 添加处理器
        logger.addHandler(console_handler)
        logger.addHandler(file_handler)
        
        return logger

# 创建默认日志记录器实例
logger = Logger.get_logger()